package com.hz.tgb.common;

import java.util.Random;
import java.util.UUID;

/**
 * 随机数工具类
 *
 * @author hezhao on 2015年4月7日 下午7:58:49
 */
public class RandomUtil {

	private static final String[] NUM_DIGITS = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };

	private static final String[] WORD_DIGITS = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };

	private static final String[] HEXSTR_DIGITS = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
			"a", "b", "c", "d", "e", "f" };

	private static final String[] ALLSTR_DIGITS = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
			"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };

	private static final String[] ANY_CHARS = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
			"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
			"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
			"~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "=", "_", "+", "[", "]", "{", "}",
			"\\", "|", ";", ":", "\"", "<", ">", "/", "?" };

	private RandomUtil() {
		// 私有类构造方法
	}

	/***
	 * 获取指定长度数字字符串
	 *
	 * @param len 指定长度
	 * @return
	 */
	public static String getRandomNum(int len) {
		return getRandomStringByArray(len, NUM_DIGITS);
	}

	/***
	 * 获取指定长度字母(小写)字符串
	 *
	 * @param len 指定长度
	 * @return
	 */
	public static String getRandomWord(int len) {
		return getRandomStringByArray(len, WORD_DIGITS);
	}

	/***
	 * 获取指定长度随机字符串，包含数字、字母(小写)
	 *
	 * @param len 指定长度
	 * @return
	 */
	public static String getRandomStr(int len) {
		return getRandomStringByArray(len, ALLSTR_DIGITS);
	}

	/***
	 * 获取指定长度16进制字符串
	 *
	 * @param len 指定长度
	 * @return
	 */
	public static String getRandomHexStr(int len) {
		return getRandomStringByArray(len, HEXSTR_DIGITS);
	}

	/***
	 * 获取指定长度随机字符串, 包含绝大多数字符，包含数字、字母(大写、小写)、特殊字符
	 *
	 * @param len 指定长度
	 * @return
	 */
	public static String getRandomAnyChars(int len) {
		return getRandomStringByArray(len, ANY_CHARS);
	}

	/**
	 * 获取指定长度随机字符串, 需要自己提供源字符数据
	 *
	 * @param len
	 * @param anyChars
	 * @return
	 */
	public static String getRandomStringByArray(int len, String[] anyChars) {
		StringBuilder sb = new StringBuilder();
		Random random = new Random();
		for (int i = 0; i < len; i++) {
			sb.append(anyChars[random.nextInt(anyChars.length)]);
		}
		return sb.toString();
	}

	/**
	 * 返回指定长度的字母(大写、小写)加数字随机数
	 *
	 * @param length
	 * @return String
	 */
	public static String getRandomNumAndWord(int length) {
		StringBuilder sb = new StringBuilder();
		Random random = new Random();
		for (int i = 0; i < length; i++) {
			// 输出字母还是数字
			String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
			// 字符串
			if ("char".equalsIgnoreCase(charOrNum)) {
				// 取得大写字母还是小写字母
				int choice = random.nextInt(2) % 2 == 0 ? 65 : 97;
				sb.append((char) (choice + random.nextInt(26)));
			} else {
				// 数字
				sb.append(String.valueOf(random.nextInt(10)));
			}
		}
		return sb.toString();
	}

	/***
	 * 根据UUID作为引子的随机数字符串
	 *
	 * @param len
	 * @return
	 */
	public static String getRandomNumByUuid(int len) {
		StringBuilder sb = new StringBuilder();
		Random random = new Random(UUID.randomUUID().hashCode());
		for (int i = 0; i < len; i++) {
			sb.append(random.nextInt(9));
		}
		return sb.toString();
	}

	/**
	 * 生产UUID
	 *
	 * @return
	 */
	public static String getUuid() {
		return UUID.randomUUID().toString();
	}

	/**
	 * 生产不带横线的UUID
	 *
	 * @return
	 */
	public static String getUuidNoLine() {
		return UUID.randomUUID().toString().replace("-", "");
	}

	public static void main(String[] args) {
		System.out.println(getRandomNum(6));
		System.out.println(getRandomWord(6));
		System.out.println(getRandomStr(6));
		System.out.println(getRandomHexStr(6));
		System.out.println(getRandomAnyChars(6));
		System.out.println(getRandomNumAndWord(6));
		System.out.println(getRandomNumByUuid(6));
		System.out.println(getUuid());
		System.out.println(getUuidNoLine());
	}
}
